#include <iostream>

using namespace std;

#include "tporo.h"
#include "tvectorporo.h"
#include "tpilaporo.h"

TPilaPoro::TPilaPoro() : v(10) //
{
	posicion=1;
}

TPilaPoro::TPilaPoro( const TPilaPoro &t): v(t.v)
{
	posicion=t.posicion;
}

TPilaPoro::~TPilaPoro()
{
	posicion=1;
}

TPilaPoro&
TPilaPoro::operator =(const TPilaPoro &t)
{
	if(this->EsVacia())
	{
		v=t.v;
		posicion=t.posicion;
	}
	else
	{
		this->~TPilaPoro();
		v=t.v;
		posicion=t.posicion;
	}

	return *this;
}

bool
TPilaPoro::operator ==(const TPilaPoro &t)
{
	bool igual = true;

	if( this->Longitud() == t.Longitud() )
	{
		for(int i = 0; i < t.Longitud() && igual; i++ )
		{
			if( this->v[i] != t.v[i] ) igual = false;
		}
	}
	else
	{
		igual = false;
	}
	return igual;
}

bool
TPilaPoro::EsVacia() const
{
	if( posicion > 1)
		return false;
	else
		return true;
}

bool
TPilaPoro::Apilar(TPoro &p)
{
	bool ret = false;

		if(posicion==v.Longitud())
		{
			int tam=v.Longitud()+10;
			TVectorPoro nuevovector(tam);
			if( nuevovector.Longitud() == tam )
			{
				nuevovector = v;
				v.~TVectorPoro();
				v = nuevovector;
				v[posicion]=p;
				posicion++;
				ret = true;
			}
		}
		else
		{
			v[posicion]=p;
			posicion++;
			ret = true;
		}

	return ret;
}

bool
TPilaPoro::Desapilar()
{
	bool ret = false;

	if(!EsVacia())
	{

		if(posicion-v.Longitud() > -10)
		{
			v[posicion-1].~TPoro();
			posicion--;
			ret = true;
		}
		else
		{
			int tam=v.Longitud()-10;
			TVectorPoro nuevovector(tam);
			if ( nuevovector.Longitud() == tam )
			{
				nuevovector = v;
				v.~TVectorPoro();
				v = nuevovector;
				v[posicion-1].~TPoro();
				posicion--;
				ret = true;
			}
		}
	}

	return ret;
}

TPoro
TPilaPoro::Cima() const
{
		if( !this->EsVacia() )
			return v[posicion-1];
		else
			return TPoro();
}
		
int
TPilaPoro::Longitud() const
{
	return v.Cantidad();
}

TPilaPoro 
TPilaPoro::operator+( const TPilaPoro &t)
{
	TPilaPoro p1(*this);
	TPilaPoro p2(t);
	TPilaPoro paux;
	TPoro poro;
	bool apila = false;


	while( !p2.EsVacia() )
	{
		poro = p2.Cima();
		apila = paux.Apilar( poro );
		if ( apila )
		{
			p2.Desapilar();
		}
	}
	while( !p1.EsVacia() )
	{
		poro = p1.Cima();
		apila = paux.Apilar( poro );
		if ( apila )
		{
			p1.Desapilar();
		}
	}

	return paux;
}

ostream &
operator<<( ostream &os, const TPilaPoro &t)
{
	TPilaPoro aux(t);

	if ( t.EsVacia() )
	{
		os << "{}";
	}
	else
	{
		os << "{";

		while( !aux.EsVacia() )
		{
			os << aux.Cima();
			aux.Desapilar();
			if( !aux.EsVacia()) os << " ";
		}
		os << "}";
	}

	return os;
}
